package com.example.cloudcity.servlet;

import com.example.cloudcity.dao.UserDao; // 导入UserDao类，用于数据库操作
import com.example.cloudcity.model.User; // 导入User类，表示用户模型
import jakarta.servlet.ServletException; // 导入ServletException类，用于处理Servlet异常
import org.slf4j.Logger; // 导入Logger接口，用于日志记录
import org.slf4j.LoggerFactory; // 导入LoggerFactory类，用于创建Logger实例

import javax.naming.Context; // 导入Context类，用于JNDI查找
import javax.naming.InitialContext; // 导入InitialContext类，用于初始化JNDI上下文
import javax.sql.DataSource; // 导入DataSource接口，用于获取数据库连接
import java.sql.Connection; // 导入Connection接口，用于数据库连接
import java.sql.PreparedStatement; // 导入PreparedStatement接口，用于执行预编译SQL语句
import java.sql.SQLException; // 导入SQLException类，用于处理SQL异常

public class UserService {
    private static final Logger logger = LoggerFactory.getLogger(UserService.class); // 创建Logger实例
    private static final UserDao userDao = new UserDao(); // 创建UserDao实例，使用单例模式

    // 获取UserService的单例实例
    public static UserService getInstance() {
        return new UserService(); // 返回新的UserService实例
    }

    // 根据电子邮件和密码选择用户
    public User selectByEmailPassword(String email, String password) throws Exception {
        return userDao.selectByEmailPassword(email, password); // 调用UserDao的方法查询用户
    }

    // 用户登录方法
    public User login(String username, String password) {
        // 数据验证
        if (!isValidInput(username, password)) { // 验证输入是否合法
            logger.warn("Invalid input: username or password is empty"); // 记录警告日志
            return null; // 返回null表示登录失败
        }

        try {
            User user = userDao.login(username, password); // 调用UserDao的方法进行登录
            if (user == null) { // 如果用户不存在
                logger.warn("User not found: {}", username); // 记录警告日志
                return null; // 返回null表示登录失败
            }
            return user; // 返回用户对象表示登录成功
        } catch (Exception e) {
            logger.error("Failed to login user: {}", e.getMessage(), e); // 记录错误日志
            return null; // 返回null表示登录失败
        }
    }

    // 验证输入是否合法
    private boolean isValidInput(String username, String password) {
        return username != null && !username.isEmpty() && password != null && !password.isEmpty(); // 检查用户名和密码是否为空
    }

    // 用户注册方法
    public void register(User user) throws ServletException {
        // 输入验证
        if (!isValidInput(user)) { // 验证用户信息是否合法
            logger.warn("Invalid input: one or more fields are empty or invalid"); // 记录警告日志
            throw new ServletException("注册失败: 输入数据无效"); // 抛出Servlet异常
        }

        Connection conn = null; // 数据库连接
        PreparedStatement pstmt = null; // 预编译SQL语句

        try {
            // 获取数据库连接
            Context initContext = new InitialContext(); // 初始化JNDI上下文
            Context envContext = (Context) initContext.lookup("java:/comp/env"); // 查找环境上下文
            DataSource ds = (DataSource) envContext.lookup("jdbc/CloudCity"); // 查找数据源
            conn = ds.getConnection(); // 获取数据库连接

            // SQL插入语句
            String sql = "INSERT INTO users (username, password, email, mobile, is_admin) VALUES (?, ?, ?, ?, ?)";
            pstmt = conn.prepareStatement(sql); // 准备SQL语句
            pstmt.setString(1, user.getUsername()); // 设置用户名
            pstmt.setString(2, user.getPassword()); // 设置密码
            pstmt.setString(3, user.getEmail()); // 设置电子邮件
            pstmt.setString(4, user.getMobile()); // 设置手机号码
            pstmt.setString(5, user.getIsadmin()); // 设置是否为管理员

            int rowsAffected = pstmt.executeUpdate(); // 执行插入操作
            if (rowsAffected > 0) { // 如果插入成功
                logger.info("User registered successfully: {}", user.getUsername()); // 记录信息日志
            } else {
                logger.warn("Failed to register user: {}", user.getUsername()); // 记录警告日志
            }
        } catch (Exception e) {
            logger.error("Error registering user: {}", e.getMessage(), e); // 记录错误日志
            throw new ServletException("注册失败", e); // 抛出Servlet异常
        } finally {
            try {
                if (pstmt != null) pstmt.close(); // 关闭PreparedStatement
                if (conn != null) conn.close(); // 关闭数据库连接
            } catch (SQLException e) {
                logger.error("Error closing resources: {}", e.getMessage(), e); // 记录错误日志
            }
        }
    }

    // 验证用户信息是否合法
    private boolean isValidInput(User user) {
        return user != null && // 用户对象不为空
               user.getUsername() != null && !user.getUsername().isEmpty() && // 用户名不为空
               user.getPassword() != null && !user.getPassword().isEmpty() && // 密码不为空
               user.getEmail() != null && !user.getEmail().isEmpty() && // 电子邮件不为空
               user.getMobile() != null && !user.getMobile().isEmpty() && // 手机号码不为空
               user.getIsadmin() != null; // 是否为管理员不为空
    }
}
